package dieciLuglio;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


public class RSA {
		
		protected static Cipher cipher;
		private static KeyPairGenerator keyGen;
		
		//BASE64:sistema di numerazione posizionale che usa 64 simboli
		
		//Genera una coppa di chiavi RSA e inizializza l'oggetto Cipher
		public static KeyPair generaChiave() throws NoSuchAlgorithmException, NoSuchPaddingException{
			keyGen=KeyPairGenerator.getInstance("RSA");
			keyGen.initialize(1024);
			KeyPair key=keyGen.generateKeyPair();
			cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
			return key;
		}

		
		// effettua la cifratura utilizzando la chiave PUBBLICA e codifica byte a BASE64 per ottenere Stringa
		public static String cripta(String s,KeyPair key) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException{
			cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
			byte[] str=s.getBytes("UTF8");
			byte[] cipherText = cipher.doFinal(str);
			BASE64Encoder encoder=new BASE64Encoder();
			String criptata=encoder.encode(cipherText);
			return criptata;
		}
		
		// effettua la decifratura utilizzando la chiave PRIVATA dopo aver decodifica la stringa con BASE64 per ottenere l'array di byte
		public static String decripta(String s,KeyPair key) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException{
			cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
			BASE64Decoder decoder=new BASE64Decoder();
			byte[] text=decoder.decodeBuffer(s);
			byte[] newPlainText = cipher.doFinal(text);
			return new String(newPlainText, "UTF8");
		}
		
}	
